home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-08-04 | 7.6 KB | 284 lines | [TEXT/PJMM] |
- unit MyTokens;
-
- interface
-
- const { Move to AppGlobals }
- token_strh = 200;
- maxtokenssize_index = 2;
- maxtokens_index = 4;
-
- type
- TokenInterface = object
- function Read (var count: longInt; data: ptr): OSErr;
- function Write (count: longInt; data: ptr): OSErr;
- end;
-
- procedure InitTokens;
- procedure FinishTokens;
- procedure ConvertTokens (tob: TokenInterface; space: ptr; space_size: longInt; remoteIP: longInt; crbecomes: str31; user: str63);
-
- implementation
-
- uses
- AppGlobals, ParameterDef, MyTranslate82728, MyTrackidle;
-
- const
- cr = 13;
- lf = 10;
- specchar = ord('%');
- fingerd_proc_type = 'PROC';
-
- var
- trans: transTable;
- max_plan_size, max_token_count: longInt;
-
- procedure CallProc (var p: parameterRecord; proc: ptr);
- inline
- $205F, $4E90;
-
- function AddPtr (src: univ Ptr; offset: longint): Ptr;
- inline
- $201F, { move.l (sp)+,d0 ; pop offset }
- $D09F, { add.l (sp)+,d0 ; add ptr to offset (and pop p) }
- $2E80; { move.l d0,(sp) ; place in result }
-
- procedure AddToPtr (var dst: univ Ptr; src: univ ptr; offset: longint);
- inline
- $201F, { move.l (sp)+,d0 ; pop offset }
- $D09F, { add.l (sp)+,d0 ; add ptr to offset (and pop p) }
- $205F, { move.l (sp)+,a0 ; pop address of p }
- $2080; { move.l d0,(sp) ; place in result }
-
- procedure ConvertTokens (tob: TokenInterface; space: ptr; space_size: longInt; remoteIP: longInt; crbecomes: str31; user: str63);
- var
- retval, paramstr: str255;
- param: parameterRecord;
- begin
- param.fingeredname := @user;
- param.param := @paramstr;
- param.returnValue := @retval;
- param.fingeroutput := space;
- param.plength := space_size;
- param.idle := (TickCount - IdleSince) div 60;
- param.remoteIP := remoteIP;
-
- end;
-
- param.offset;
- param.expandtokens
-
- procedure GetSpecial (p: ptr; var offset: longInt; count: longInt; var name: str63; var paramstr: str255);
- type
- charSet = set of char;
- procedure GetChars (cs: charSet);
- var
- initoff, len: longInt;
- begin
- initoff := offset;
- while (offset < count) and (chr(AddPtr(p, offset)^) in cs) do
- offset := offset + 1;
- len := offset - initoff;
- if len > 255 then
- len := 255;
- {$PUSH}
- {$R-}
- paramstr[0] := chr(len);
- BlockMove(AddPtr(p, initoff), @paramstr[1], len);
- {$POP}
- len := Pos('-', paramstr);
- if len = 0 then begin
- name := paramstr;
- paramstr := '';
- end
- else begin
- name := copy(paramstr, 1, len - 1);
- paramstr := copy(paramstr, len + 1, 255);
- end;
- end;
- begin
- case chr(AddPtr(p, offset)^) of
- '"': begin
- offset := offset + 1;
- GetChars([' '..'!', '#'..'~']);
- if chr(AddPtr(p, offset)^) = '"' then
- offset := offset + 1;
- end;
- '''': begin
- offset := offset + 1;
- GetChars([' '..'&', '('..'~']);
- if chr(AddPtr(p, offset)^) = '''' then
- offset := offset + 1;
- end;
- otherwise
- GetChars(['A'..'Z', 'a'..'z', '0'..'9', '_', '-', ':']);
- end;
- end;
- const
- MyPIn = PIn;
- var
- oe, ooe: OSErr;
- count: longInt;
- refnum: integer;
- hin, hout: handle;
- pin, pout: ptr;
- inoff, outoff, len, newin, i: longInt;
- b: signedByte;
- sysenv: SysEnvRec;
- retval, paramstr: str255;
- th: handle;
- param: parameterRecord;
- proch: handle;
- localhost, charsavailable: longInt;
- remoteport, localport, constate: integer;
- oldvrn: integer;
- oldvrnoe: OSErr;
- tokencount: longInt;
- begin
- oldvrnoe := GetVol(nil, oldvrn);
- tokencount := max_token_count;
- oe := MFSOpenDF(refnum, vrn, dirID, name, MyPIn);
- if oe <> noErr then begin
- oe := SysEnvirons(1, sysenv);
- if oe = noErr then
- ooe := SetVol(nil, sysenv.sysVRefNum);
- oe := MFSOpenDF(refnum, sysenv.sysVRefNum, 0, ':Preferences:Plan', MyPIn);
- end
- else begin
- ooe := SysEnvirons(1, sysenv);
- if ooe = noErr then
- ooe := SetVol(nil, sysenv.sysVRefNum);
- end;
- if oe = noErr then begin
- hout := MyTempNewHandle(max_plan_size + 1, oe);
- if oe = noErr then begin
- oe := GetEOF(refnum, count);
- if oe = noErr then
- hin := MyTempNewHandle(max_plan_size + 1, oe);
- if oe = noErr then begin
- MyTempHLock(hin, oe);
- if oe = noErr then
- MyTempHLock(hout, oe);
- if count > max_plan_size then
- count := max_plan_size;
- if oe = noErr then
- oe := FSRead(refnum, count, hin^);
- if oe = noErr then begin
- param.fingeredName := @user;
- param.param := @paramstr;
- param.returnValue := @retval;
- param.fingeroutput := hout;
- param.idle := (TickCount - IdleSince) div 60;
- TCPRawState(tcpc, constate, localhost, localport, param.remoteIP, remoteport, charsavailable);
- inoff := 0;
- outoff := 0;
- pin := hin^;
- while (outoff <= max_plan_size - 2) and (inoff < count) do begin
- b := pin^;
- AddToPtr(pin, pin, 1);
- inoff := inoff + 1;
- AddToPtr(pout, hout^, outoff);
- case b of
- cr: begin
- pout^ := cr;
- AddToPtr(pout, pout, 1);
- pout^ := lf;
- outoff := outoff + 2;
- end;
- lf:
- ;
- specchar:
- if (pin^ = specchar) or (pin^ = 13) or (tokencount <= 0) then begin
- if pin^ <> 13 then begin
- pout^ := specchar;
- outoff := outoff + 1;
- end;
- if (pin^ = specchar) or (pin^ = 13) then begin
- AddToPtr(pin, pin, 1);
- inoff := inoff + 1;
- end;
- end
- else begin
- retval := '';
- GetSpecial(hin^, inoff, count, name, paramstr);
- AddToPtr(pin, hin^, inoff);
- proch := GetNamedResource(fingerd_proc_type, name);
- if (proch <> nil) & (proch^ <> nil) then begin
- tokencount := tokencount - 1;
- if max_plan_size - outoff < max_plan_size - count + inoff then
- param.hlength := max_plan_size
- else
- param.hlength := outoff + max_plan_size - count + inoff;
- param.offset := outoff;
- param.expandtokens := true;
- HLock(proch);
- CallProc(param, proch^);
- HUnlock(proch);
- HPurge(proch);
- if param.expandtokens then begin
- len := param.offset - outoff;
- if len > 0 then begin
- if len > max_plan_size - count + inoff then
- len := max_plan_size - count + inoff;
- BlockMove(AddPtr(hin^, inoff), AddPtr(hin^, len), count - inoff);
- BlockMove(AddPtr(hout^, outoff), hin^, len);
- count := len + count - inoff;
- inoff := 0;
- pin := ptr(hin^);
- end;
- end
- else
- outoff := param.offset;
- end
- else
- retval := concat('?', name, '?');
- AddToPtr(pout, hout^, outoff);
- len := length(retval);
- if len > param.hlength - outoff then
- len := param.hlength - outoff;
- if len > 0 then begin
- BlockMove(@retval[1], pout, len);
- for i := 1 to length(retval) do begin
- pout^ := trans[BAND(pout^, $FF)];
- longInt(pout) := longInt(pout) + 1;
- end;
- outoff := outoff + len;
- end;
- end;
- otherwise begin
- pout^ := trans[BAND(b, $FF)];
- outoff := outoff + 1;
- end;
- end; {case}
- end;{while}
- ooe := TCPSendAsync(tcpc, hout^, outoff, nil);
- end;
- MyTempDisposeHandle(hin, ooe);
- end;
- MyTempDisposeHandle(hout, ooe);
- end;
- ooe := FSClose(refnum);
- end;{if open}
- if oe <> noErr then
- NoPlan;
- if oldvrnoe = noErr then
- oe := SetVol(nil, oldvrn);
- end;
-
- procedure InitTokens;
- var
- s: str255;
- begin
- GetIndString(s, tokens_strh, maxplansize_index);
- StringToNum(s, max_tokens_size);
- if max_tokens_size < 1000 then
- max_tokens_size := 1000;
- GetIndString(s, tokens_strh, maxtokens_index);
- StringToNum(s, max_token_count);
- GetTrans(translateOutResID, trans);
- end;
-
- procedure FinishTokens;
- begin
- end;
-
- end.